package com.example.cpopcopy.controller;

import com.example.cpopcopy.mapper.LoveMusicMapper;
import com.example.cpopcopy.mapper.MusicMapper;
import com.example.cpopcopy.model.Music;
import com.example.cpopcopy.model.User;
import com.example.cpopcopy.tools.Constant;
import com.example.cpopcopy.tools.ResponseMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: fzykd
 * Date: 2022-10-20
 * Time: 20:03
 */

@RestController
@RequestMapping("/Music")
public class MusicController {

    private String SAVE_PATH = "E:/Music/";

    @Autowired
    private MusicMapper musicMapper;


    //上传歌曲
    //上传音乐有很多的参数 但是前端传来就一个音乐文件和歌手的名字
    //不知这里参数该如何布置
    @RequestMapping("/upload")             //这里重命名 是前端传来的文件的名字input标签当中name的值 为 filename
    public ResponseMessage<Boolean> upload(@RequestParam("filename")MultipartFile file, @RequestParam String singer,
                                           HttpServletRequest request,
                                           HttpServletResponse response) {

        //获取用户的Session
        //第一判断用户是否登录成功 第二是要获取用户的信息 存在数据库里
        HttpSession httpSession = request.getSession(false);
        if (httpSession == null || httpSession.getAttribute(Constant.USERINFO_SESSION_KEY) == null) {
            System.out.println("没有的登录");
            return new ResponseMessage<>(-1, "请登录后上传", false);
        }


        //首先是将该文件上传到 服务器本地的磁盘上
        //这是获取原始的文件名字包括了 ***.mp3
        String fileNameAndType = file.getOriginalFilename();
        System.out.println(fileNameAndType);

        //将文件上传到硬盘具体某个路径下
        String path = SAVE_PATH + fileNameAndType;
        System.out.println(path);

        //存储文件  transferTo是MultipartFile中的方法
//        在文件上传的时候，MultipartFile中的transferTo(dest)方法只能使用一次;
//
//        并且使用transferTo方法之后不可以在使用getInputStream()方法;
//
//        否则再使用getInputStream()方法会报异常java.lang.IllegalStateException: File has been moved - cannot be read again;
//
//        使用transferTo(dest)方法将上传文件写到服务器上指定的文件;
//        原因文件流只可以接收读取一次，传输完毕则关闭流;
        File dest = new File(path);
        //判读dest是否存在 是否为空
        if (!dest.exists()) {
            //如果不存在那么就创建
            dest.mkdir();
            //创建目录
        }
        //如果存在那么就上传文件

        try {
            //用的是file点方法  这个是MultipartFile中的方法
            file.transferTo(dest);
        } catch (IOException e) {
            e.printStackTrace();
            return new ResponseMessage<>(-1, "服务器上传失败", false);

        }

        //服务器上传成功之后 就上传数据库
        //1.从上传的参数当中获取到要上传到数据的参数
        //lastIndexOf 最后索引的意思 找到最后一个"."的下标 返回值是一个int

        //fileNameAndType 包括了歌名.mp3
        int index = fileNameAndType.lastIndexOf(".");
        //获取到title歌名 获取字串 从0开始 到index结束  前闭后开
        String title = fileNameAndType.substring(0, index);

        //获取用户id
        //从Session当中获取到用户的id  大有学问
        User user = (User) httpSession.getAttribute(Constant.USERINFO_SESSION_KEY);
        int userid = user.getId();

        //获取url  它的作用是播放音乐 其实是一个http请求
        String url = "/Music/get?path=" + path;

        //获取上传的信息 固定的格式  SimpleDateFormat 简单日期格式  HH:mm:ss这个是获取时分秒
        //森剖dateForMat
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
        //将当前时间格式化 以上字符串形式
        System.out.println(sf);
        String time = sf.format(new Date());
        System.out.println(time);

        //不是一来就调用数据库
        int ret = 0;
        ret = musicMapper.insert(title, singer, time, url, userid);
        if (ret == 1) {
            //上传成功
            try {
                //跳转到列表页面
                response.sendRedirect("/list.html");
                return new ResponseMessage<>(0, "数据上传成功", true);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
            //如果数据库 没有上传成功 那么删除服务器上传的文件
            dest.delete();
            return new ResponseMessage<>(-1, "数据库上传失败", false);
    }

    //播放音乐模块
    @RequestMapping("/get")
    //响应实体的方法  安特体
    public ResponseEntity<byte[]> func(String path){
        //播放音乐 前端传来的路径  服务器返回的字节信息
        File file = new File(path);
        byte[] a = null;
        try {
            //readAllBytes 读取所有字节
            a = Files.readAllBytes(file.toPath());
            if (a == null){
                return ResponseEntity.badRequest().build();
            }
            //调用这个ok方法 会解析数组a中的字节内容放到响应的body当中
            return ResponseEntity.ok(a);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return ResponseEntity.badRequest().build();
    }

    //删除音乐 模块
    @RequestMapping("/delete")
    public ResponseMessage<Boolean> deleteMusicById(@RequestParam Integer id){

        //1.先检查音乐是否存在
        Music music = musicMapper.findMusicById(id);
        if (music == null){
            System.out.println("没有这个id");
            return new ResponseMessage<>(-1,"没有你要删除的音乐",false);
        }else {
            //2.如果存在那么就删除音乐  第一删除数据  第二 删除服务器文件
            int ret = musicMapper.deleteMusicById(id);
            if (ret == 1){
                //在删除服务器上的数据
                String title = music.getTitle();
                File file = new File(SAVE_PATH+title+".mp3");
                System.out.println(file.getPath());
                if (file.delete()){
                    //同步删除lovemusic表中的这个音乐

                    return new ResponseMessage<>(1,"服务器删除成功",true);

                }else {
                    return new ResponseMessage<>(-1,"服务器删除音乐失败",false);
                }
            }else {
                return new ResponseMessage<>(-1,"数据库中的音乐删除失败",false);

            }
        }
    }

    @Autowired
    private LoveMusicMapper loveMusicMapper;

    //进行批量删除操作 无非就是传来多个参数 将多个参数 循环删除 接收参数时候 细节要注意
    @RequestMapping("/deletes")
    public ResponseMessage<Boolean> deletesMusicById(@RequestParam("id[]") List<Integer> id){
        System.out.println(id);
        int sum = 0;
        for (int i = 0; i < id.size(); i++) {
            Music music = musicMapper.findMusicById(id.get(i));
            //如果存在 那么就删除
            if (music == null){
                System.out.println("没有这个id");
                return new ResponseMessage<>(-1,"没有要删除的歌曲",false);
            }
            int ret = musicMapper.deleteMusicById(id.get(i));
            //ret==1了那么数据库就删除成功了
            if (ret == 1){
                //那么就删除服务器本地的数据
                String title = music.getTitle();
                File file = new File(SAVE_PATH + title + ".mp3");
                //打印出来看一下
                System.out.println(file.getPath());
                if (file.delete()){
                    //如果已经删除了之后 同步删除喜欢列表中的歌曲
                    loveMusicMapper.deleteLoveMusic(id.get(i));
                    sum += 1;
                }else {
                    return new ResponseMessage<>(-1,"服务器删除失败",false);
                }
            }else {
                return new ResponseMessage<>(-1,"数据库数据删除失败",false);
            }
        }
        if (sum == id.size()){
            System.out.println("全部删除成功！");
            return new ResponseMessage<>(1,"删除成功",true);

        }else {
            System.out.println("整体删除失败!");
            return new ResponseMessage<>(-1,"删除失败",false);
        }

    }

    //查询所有音乐
    @RequestMapping("/findMusic")
    public ResponseMessage<List<Music>> funcMusic(@RequestParam(required = false) String musicName){
        List<Music> musicList = null;
        if (musicName != null){
            musicList = musicMapper.findMusicName(musicName);
        }else {
            musicList = musicMapper.findMusic();
        }
        return new ResponseMessage<>(0,"查到了所有歌曲",musicList);
    }


}
